package com.ywq.app.biz.impl;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.ywq.app.bean.ImageWeb;
import com.ywq.app.biz.ImageBiz;
import com.ywq.common.constant.Constant;
import com.ywq.common.constant.HttpProxy;
import com.ywq.common.exception.AppBusinessException;
import com.ywq.common.util.Common;

public class ImageBizImpl implements ImageBiz {

	private final static Logger logger = LoggerFactory
			.getLogger(ImageBizImpl.class);

	private String uploadPath;
	private String imageServer;


	public void setUploadPath(String uploadPath) {
		this.uploadPath = uploadPath;
	}

	public void setImageServer(String imageServer) {
		this.imageServer = imageServer;
	}

	

	@Override
	public boolean checkUploadSize(HttpServletRequest request)
			throws AppBusinessException {
		try {
			MultipartHttpServletRequest re = (MultipartHttpServletRequest) request;
			Map<String, MultipartFile> map = re.getFileMap();
			List<MultipartFile> fileList = new ArrayList<MultipartFile>();
			for (Object obj : map.values()) {
				MultipartFile file = (MultipartFile) obj;
				fileList.add(file);
			}
			if (fileList.size() > 0) {
				MultipartFile fj = fileList.get(0);
				if (fj.getSize() > Constant.PHOTO_SIZE_ALLOW) {
					return false;
				} else
					return true;
			}
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			throw new AppBusinessException("check upplad size failure!", e);
		}

	}

	@Override
	public ImageWeb uploadOneImg(HttpServletRequest request, String picType,String imageDir)
			throws AppBusinessException {
		ImageWeb imageWeb = new ImageWeb();
		imageWeb.setState("上传失败！");
		try {
			MultipartHttpServletRequest re = (MultipartHttpServletRequest) request;
			Map<String, MultipartFile> map = re.getFileMap();
			List<MultipartFile> fileList = new ArrayList<MultipartFile>();
			for (Object obj : map.values()) {
				MultipartFile file = (MultipartFile) obj;
				fileList.add(file);
			}
			if (fileList.size() > 0) {
				MultipartFile fj = fileList.get(0);
				String fn = fj.getOriginalFilename();
				if (null != fn && fn.length() > 0) {
					// 图片不能超过允许的大小
					if (fj.getSize() > Constant.PHOTO_SIZE_ALLOW) {
						imageWeb.setSizeAllow(false);
						return imageWeb;
					} else {
						InputStream buffin = new ByteArrayInputStream(
								fj.getBytes());
						BufferedImage bi = ImageIO.read(buffin);
						if (bi != null) {
							String now = Common.getFormatDate(new Date(),
									"yyyyMMdd");
							String uuid = UUID.randomUUID().toString();
							String imageFix = fn.substring(fn.lastIndexOf("."));
							String serverUrl = imageServer + "receiveImage.htm";
							
							String savePath = uploadPath + "/" + picType + "/"
									+ now;
							requestSaveImage(serverUrl, savePath, uuid
									+ imageFix, fj.getBytes());
							imageWeb.setImageServer(imageServer);
							imageWeb.setImageUrl(uploadPath + "/" + picType
									+ "/" + now + "/" + uuid + imageFix);
							imageWeb.setWidth(bi.getWidth());
							imageWeb.setHeight(bi.getHeight());
							imageWeb.setSizeAllow(true);
							imageWeb.setState("SUCCESS");
							//cutImage(fj.getBytes(), Common.THUMB_WIDTH_300, Common.THUMB_HEIGHT_200, savePath, uuid + imageFix + "_300x200.jpg");
							//cutImage(fj.getBytes(), Common.THUMB_WIDTH_100, Common.THUMB_HEIGHT_100, savePath, uuid + imageFix + "_100x100.jpg");
							proceImage(imageWeb.getImageUrl(),Common.THUMB_WIDTH_300, Common.THUMB_HEIGHT_200,1,imageFix+"_300x200", imageDir);
							proceImage(imageWeb.getImageUrl(),Common.THUMB_WIDTH_100, Common.THUMB_HEIGHT_100,1,imageFix+"_100x100",imageDir);
						}
						return imageWeb;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return imageWeb;
		}
		return imageWeb;
	}

	@Override
	public void requestSaveImage(String serverUrl, String savePath,
			String saveFilename, byte[] imageData) throws AppBusinessException {
		try {
			String ret = HttpProxy.sendImage(serverUrl, savePath, saveFilename,
					imageData);
			if (null == ret || "error".equals(ret)) {
				if (logger.isErrorEnabled()) {
					logger.error("Request save image failure!");
				}
				throw new AppBusinessException();
			}
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request save image failure!", e);
			}
			throw new AppBusinessException(e);
		}
	}

	@Override
	public void requestDeleteImage(String serverUrl, String imageFile)
			throws AppBusinessException {
		try {
			String ret = HttpProxy.deleteImage(serverUrl, imageFile);
			if (null == ret || "error".equals(ret)) {
				if (logger.isErrorEnabled()) {
					logger.error("Request delete image failure!");
				}
				throw new AppBusinessException();
			}
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Request delete image failure!", e);
			}
			throw new AppBusinessException(e);
		}
	}

	@Override
	public void requestDeleteImage(String imageFile)
			throws AppBusinessException {
		requestDeleteImage(imageServer + "deleteImage.htm", imageFile);
	}

	@Override
	public void saveImage(byte[] in, String savePath, String saveFilename,String imageDir)
			throws AppBusinessException {
		try {
			String path = imageDir + File.separator + savePath + File.separator;
			File filePath = new File(path);
			if (!filePath.exists()) {
				filePath.mkdirs();
			}
			String fileName = path + saveFilename;
			File f = new File(fileName);
			FileOutputStream out = new FileOutputStream(f);
			out.write(in);
			out.close();
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Save image failure!", e);
			}
			throw new AppBusinessException(e);
		}
	}

	/*@Override
	public void deleteImage(String imageFile) throws AppBusinessException {
		try {
			String fileName = imageDir + File.separator + imageFile;
			File file = new File(fileName);
			file.delete();
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Delete image failure!", e);
			}
			throw new AppBusinessException(e);
		}
	}*/

	
	
	  //等比例缩放
	    private int wideth;
	    private int height;
	    private String t = null;

	    public void setT(String t) {
	        this.t = t;
	    }

	    public void setWideth(int wideth) {
	        // wideth=320;
	        this.wideth = wideth;
	    }

	    public int getWideth() {
	        return this.wideth;
	    }

	    public void setHeight(int height) {
	        // height=240;
	        this.height = height;
	    }

	    public int getHeight(int w, int h) // former images size
	    {
	        // int hhh;
	        if (w > wideth) {
	            float ww;
	            ww = (float) w / (float) wideth;
	            float hh = h / ww;
	            return (int) hh;
	        } else {
	            this.setWideth(w);
	            return h;
	        }

	    }

	    public void proce(String fpath) throws Exception {
	        File _file = new File(fpath);
	        Image src = javax.imageio.ImageIO.read(_file);
	        int wideth = src.getWidth(null);
	        int height = src.getHeight(null);
	        int h = this.getHeight(wideth, height);
	        BufferedImage tag = new BufferedImage(this.getWideth(), h,
	                BufferedImage.TYPE_INT_RGB);
	        Graphics g = tag.getGraphics();
	        g.drawImage(src, 0, 0, this.getWideth(), h, null);
	        if (t != null) {
	            g.setColor(new Color(242, 242, 242));
	            g.fillRect(this.getWideth() - 120, h - 18, 120, 18);
	            g.setColor(new Color(180, 180, 180));
	            g.drawRect(this.getWideth() - 120, h - 18, 119, 17);
	            g.setColor(new Color(255, 102, 0));
	            g.drawString(t, this.getWideth() - 100, h - 5);
	        }
	        FileOutputStream out = new FileOutputStream(fpath);
	        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	        encoder.encode(tag);
	        out.close();
	    }

	    /**
	    * 压缩图片方法
	    *
	    * @param oldFile
	    *            将要压缩的图片
	    * @param width
	    *            压缩宽
	    * @param height
	    *            压缩长
	    * @param quality
	    *            压缩清晰度 <b>建议为1.0</b>
	    * @param smallIcon
	    *            压缩图片后,添加的扩展名
	    * @return
	    */
	    public  String proceImage(String oldFile, int width, int height, float quality,
	            String smallIcon,String imageDir) {
	        if (oldFile == null) {
	            return null;
	        }
	        String newImage = null;
	        try {
	            String path = imageDir +File.separator+ oldFile ;
				File file = new File(path);
	            if(!file.exists()) //文件不存在时
	                return null;
	            /** 对服务器上的临时文件进行处理 */
	            //Image srcFile = ImageIO.read(new URL(oldFile));
	           Image srcFile = ImageIO.read(file);
	            // 为等比缩放计算输出的图片宽度及高度
	            double rate1 = ((double) srcFile.getWidth(null)) / (double) width
	                    + 0.1;
	            double rate2 = ((double) srcFile.getHeight(null)) / (double) height
	                    + 0.1;
	            double rate = rate1 > rate2 ? rate1 : rate2;
	            int new_w = (int) (((double) srcFile.getWidth(null)) / rate);
	            int new_h = (int) (((double) srcFile.getHeight(null)) / rate);
	            /** 宽,高设定 */
	            BufferedImage tag = new BufferedImage(new_w, new_h,
	                    BufferedImage.TYPE_INT_RGB);
	            tag.getGraphics().drawImage(srcFile, 0, 0, new_w, new_h, null);
	            String filePrex = path.substring(0, path.indexOf('.'));
	            /** 压缩后的文件名 */
	            // newImage =smallIcon + filePrex
	            // +oldFile.substring(filePrex.length());     + path.substring(filePrex.length())
	            newImage = filePrex + smallIcon;
	            // newImage = smallIcon;
	            /** 压缩之后临时存放位置 */
	            FileOutputStream out = new FileOutputStream(newImage);

	            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
	            /** 压缩质量 */
	            jep.setQuality(quality, true);
	            encoder.encode(tag, jep);

	            out.close();
	            srcFile.flush();

	        } catch (FileNotFoundException e) {
	        	System.out.println(e);
	            e.printStackTrace();
	        } catch (IOException e) {
	        	System.out.println(e);
	            e.printStackTrace();
	        }
	        return newImage;
	    }
	    
	    
	    //
	    @Override  
	    public String uploadFlv(HttpServletRequest request,String flvType,String imageDir)  throws IllegalStateException, IOException {  
	        // 获取服务器上下文路径  
	        String path = imageDir;
	        // 创建文件存放路径  
	        File folder = new File(path);  
	        if (!folder.exists())  
	        {  
	            folder.mkdirs();  
	        }  
	        // 获取上传的文件  
	        //MultipartFile multiFile = multipartRequest.getFile("file");  
	        MultipartHttpServletRequest re = (MultipartHttpServletRequest) request;
			Map<String, MultipartFile> map = re.getFileMap();
			List<MultipartFile> fileList = new ArrayList<MultipartFile>();
			for (Object obj : map.values()) {
				MultipartFile file = (MultipartFile) obj;
				fileList.add(file);
			}
			String flvUrl="";
			if (fileList.size() > 0) {
				MultipartFile multiFile = fileList.get(0);
				//String now = Common.getFormatDate(new Date(),"yyyyMMdd");
	        // 获得文件全名  
				String fname = multiFile.getOriginalFilename(); 
				String flvFix = fname.substring(fname.lastIndexOf("."));
				String uuid = UUID.randomUUID().toString();
				String savePath = uploadPath + "/" + flvType  + "/" + uuid + flvFix;
		        // 创建上传文件全信息为查找看是否能读到本次上传文件  
				File isfile = new File(path + "/" + fname);  
		       // long sizeNum = multiFile.getSize();  
		       // String softVersion = fname.split("v")[1].substring(0, 7);  
		        String fileNames = path + "/" + savePath;  
		        File file = new File(fileNames);  
		        // 如果文件不存在写文件到服务器  
		        multiFile.transferTo(file);  
		        flvUrl=imageServer+savePath;
	        }
	       return flvUrl;  
	    }  
	    
}
